#ifndef HEAPTIMER_H
#define HEAPTIMER_H

#include <vector>
#include <unordered_map>
#include <algorithm>
#include <chrono>
#include <functional>
#include <arpa/inet.h>
#include <assert.h>
#include <time.h>

#include "../log/log.h"

using TimeOutCallBack = std::function<void()>;                      // 处理超时事件 
using Clock = std::chrono::high_resolution_clock;                   // 高精度时间
using MS = std::chrono::milliseconds;                               // 毫秒
using TimeStamp = std::chrono::high_resolution_clock::time_point;   // 时间点的具体类型

// 定时任务节点
struct TimerNode {
    int id_;                  // 任务标识符
    TimeStamp expires_;       // 任务的超时时间点（具体的时间戳）
    TimeOutCallBack cb_;      // 超时处理函数

    bool operator<(const TimerNode& t) {
        return expires_ < t.expires_;
    }
};

class HeapTimer {
public:
    HeapTimer();
    ~HeapTimer();

    void adjust(int id, int timeOut);
    void addNode(int id, int timeOut, const TimeOutCallBack& cb);

    void doWork(int id);
    void clear();
    void tick();
    void pop();
    int getNextTick();
private:
    void deleteNode(size_t index);
    void siftup(size_t i);
    bool siftdown(size_t index, size_t n);
    void swapNode(size_t i, size_t j);
private:    
    std::vector<TimerNode> heap_;           // 时间堆
    std::unordered_map<int, size_t> ref_;   // 记录任务节点到时间堆下标的映射
};


#endif